
/*
*Released on 28th June 2008.
*Any violations can be reported at paritosh@wikiocean.net
*What is treated as violations can be found at www.wikiocean.net/ppl1-voilations*
******************************************************************************
* The contents of this file are subject to POOL Public License 1.0 and later.
* POOL Public License is based on Affero GPL v3 and additional conditions.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the Affero GPL v3 License at http://www.gnu.org/licenses/agpl.html
* You may obtain a copy of the POOL Public License 1.0 or later at www.wikiocean.net/license/ppl.html
* Software distributed under POOL Public License 1.0 is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya (C) 2008. All Rights Reserved.
******************************************************************************
* Objective of the additional terms (license)
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencies.
* 3) To avoid a situation where big corporate or investor can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the freedom is curtailed in companies that get Venture Capital funding.)
******************************************************************************
*/

package  pool.preprocess;

import java.util.Hashtable;
import java.util.Vector;
import logger.PoolLogger;
import pool.tablename.Pool;
import utility.ConvertToLower;

import database.RecordSearch;
import dbmanager.ChekInMaster;
import dbmanager.Column;
import dbmanager.DBManager;
import dbmanager.GetIdName;

public class Mapper implements Process 
{
	Pool pool;
	String TYPE="type";
	GetIdName gid;
	String OLDVALUE="oldvalue";
	String NEWVALUE="newvalue";
	PoolLogger pl;
	
	public Mapper() {
		// logger
		pl = (PoolLogger) PoolLogger.getLogger(this.getClass().getName());
	}
	
	public void beforeAdd(String value) 
	{
		process(value);
	}

	public void beforeDel(String value) 
	{
	
	}

	public void beforeMod(String value) 
	{
		
	}

	public void beforeView(String value) 
	{
		
	}

	public Hashtable<Object, Object> gethashtable() 
	{
		return new Hashtable<Object, Object>();
	}

	public void process(String value) 
	{
		RecordSearch rs =new RecordSearch();
		Hashtable<Object, Object> Condition = new Hashtable<Object, Object>();
		Condition.put("mid", value);
		Condition.put("td", "null");
		rs.setConditionMap(Condition);
		String line[]= rs.getArrayFromResultSet();
		if(line.length>0)
		{
		  Hashtable<Object, Object> MasterMap = pool.getmasterHashtabel();
		  Vector<Object> propertyvector = pool.getpropertyVector();
		  for(int i=0;i<line.length;i++)
		  {
			  String splitline[] = line[i].split("\t");
			  if(!splitline[Column.pid_index-1].equals(TYPE))
			  {
				  String property= gid.getItem(splitline[Column.pid_index-1]);
				  Condition.clear();
				  Condition.put("mid", splitline[Column.pv_index-1]);
				  Condition.put("td", "null");
				  rs.setConditionMap(Condition);
				  String result[] = rs.getArrayFromResultSet();
				  Hashtable<Object, Object> oldvaluehash = new Hashtable<Object, Object>();
				  for(int k=0;k<result.length;k++)
				  {
					  String spliresult[] = result[k].split("\t");
					  String pv = spliresult[Column.pv_index-1];
					  if(pv.equals("0"))
						  pv = spliresult[Column.vt_index-1];
					  else
						  pv = gid.getItem(pv);
					  oldvaluehash.put(gid.getItem(spliresult[Column.pid_index-1]), pv);
				  }
				  oldvaluehash = ConvertToLower.convertHashKey(oldvaluehash);
				  if(MasterMap.containsKey(property))
				  {
					  String tempv = MasterMap.get(property).toString();
					  if(oldvaluehash.containsKey(OLDVALUE))
					  {
						  String oldvalue = oldvaluehash.get(OLDVALUE).toString();
						  if(MasterMap.get(property).equals(oldvalue))
						  {
							  String newvalue =oldvaluehash.get(NEWVALUE).toString();
							  MasterMap.put(property, newvalue);
						  }
					  }
				  }
				  else
				  {
					  for(int j=0;j<propertyvector.size();j++)
					  {  
						  Hashtable<Object, Object> propertymap = (Hashtable<Object, Object>) propertyvector.get(j);
						  String pid=propertymap.get("pid").toString();
						  
						  if(pid.equals(splitline[Column.pid_index-1]))
						  {
							  String temppv="";
							  if(propertymap.containsKey("pv"))
							  {
								  temppv = propertymap.get("pv").toString();
								  temppv = gid.getItem(temppv);
							  }  
							  else
							  {
								  temppv = propertymap.get("vt").toString();
							  }  
							  if(oldvaluehash.containsKey(OLDVALUE))
							  {
								  String oldvalue = oldvaluehash.get(OLDVALUE).toString();
								  if(temppv.equals(oldvalue))
								  {
									  String newvalue =oldvaluehash.get(NEWVALUE).toString();
									  ChekInMaster checkinmaster =new ChekInMaster();
									  if(checkinmaster.isInMaster(newvalue))
									  {
										  propertymap.put("pv", gid.getId(newvalue));
										  propertymap.put("vt", "no$");
									  }
									  else
									  {
										  propertymap.put("pv","0");
										  propertymap.put("vt", newvalue);										 
									  }
								  }
							  }
						  }
					  }
				  }	  
				  
			  }
			}
		  pool.setHashtable(MasterMap);
		  pool.setPropertyVector(propertyvector);
	  		
		}
		
	}

	public void setObject(Object object) 
	{
		this.pool = (Pool) object;
		gid= new GetIdName();
		TYPE = gid.getId(TYPE);
	}

	public void setType(String type, String table) 
	{
		
	}


	public Hashtable<Object, Object> getMasterMap() {
		// TODO Auto-generated method stub
		return null;
	}


	public Vector<Object> getPropertyVector() {
		// TODO Auto-generated method stub
		return null;
	}


	public void setBasicMap(Hashtable<Object, Object> Mastermap) {
		// TODO Auto-generated method stub
		
	}


	public void setMasterMap(Hashtable<Object, Object> Mastermap) {
		// TODO Auto-generated method stub
		
	}


	public void setPropertyvector(Vector<Object> PropertyVector) {
		// TODO Auto-generated method stub
		
	}

}
